﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ShopNet.Model;

namespace ShopNet
{
    public partial class VisualizarProduto : Page
    {
        #region Propriedades

        public new Shop Master
        {
            get
            {
                return ((Shop)(base.Master));
            }
        }

        public int IdProduto
        {
            get
            {
                if (ViewState["IdProduto"] == null) return 0;
                return Convert.ToInt32(ViewState["IdProduto"]);
            }

            set { ViewState.Add("IdProduto", value); }
        }

        public string RetornarImageUrl(string nomeImage)
        {
            const string sFileDir = "Imagem/produtos/";

            return File.Exists(Server.MapPath(sFileDir + nomeImage)) ? sFileDir + nomeImage : "Imagem/noproduct.jpg";
        }

        #endregion


        #region Metodos

        #region AddChart

        public void AddChart(int idProduto)
        {
            if (Session["cesta"] == null) Session.Add("cesta", new List<ProdutoCarrinho>());

            var lista = (IList<ProdutoCarrinho>)Session["cesta"];
            if (lista.Where(d => d.IdProduto == idProduto).Count() == 0)
            {
                Produto prod = NServico.Db.Produtos.FirstOrDefault(p => p.IdProduto == idProduto);
                if (!prod.IsDisponivel)
                {
                    Master.ExibirMensagem(Shop.TipoMensagem.Error, "produto Indisponível.");
                    return;
                }
                ProdutoCarrinho pc = new ProdutoCarrinho { IdProduto = idProduto, QtdeProduto = 1, QtdeCadaPacote = prod.QtdeCadaPacote};
                pc.Valor = NServico.Db.Produtos.FirstOrDefault(p => p.IdProduto == idProduto).precoDesconto;
                lista.Add(pc);
            }
            //else
            //    lista[idProduto]++;

            Response.Redirect("Cesta.aspx", true);
        }

        #endregion

        #region CarregarProduto

        private void CarregarProduto()
        {
            Produto prod = NServico.Db.Produtos.FirstOrDefault(p => p.IdProduto.Equals(IdProduto));

            #region Imagens

            IList<Imagem> imagens = NServico.Db.Imagems.Where(i => i.IdProduto == prod.IdProduto).ToList();
            if (imagens.Count > 0)
            {
                #region Imagem Principal

                Imagem im = (imagens.Where(ii => ii.Principal).Count() > 0)
                                ? imagens.FirstOrDefault(ii => ii.Principal)
                                : imagens[0];


                iImagem.ImageUrl = RetornarImageUrl(im.Nome);
                hlImagem.NavigateUrl = iImagem.ImageUrl;
                //codigo da imagem ja adicionado (principal ou primeira)
                int idCodImageAdd = im.IdImagem;

                IList<Imagem> lista = imagens.Where(i => i.IdImagem != idCodImageAdd).ToList();
                rImagens.DataSource = lista;
                rImagens.DataBind();

                #endregion

            }
            else
            {
                //se nao tem imagem nao exibe galeria
                hlImagem.Attributes.Remove("rel");
                hlImagem.NavigateUrl = "#";
            }

            #endregion

            lNomeProduto.Text = prod.Nome;
            lPrecoPacote.Text = prod.PrecoPacote.ToString("#,##0.00");
            lPrecoDesconto.Text = prod.precoDesconto.ToString("#,##0.00");

            lPrecoPacote.Visible = (prod.PrecoPacote != prod.precoDesconto);
            lSimbolo.Visible = lPrecoPacote.Visible;

            lDescricao.Text = prod.Descricao;

            lbAddChart.Visible = prod.IsDisponivel;
            lIndisponivel.Visible = !prod.IsDisponivel;
            lQtdeCadaPacote.Text = prod.QtdeCadaPacote.ToString();
            lPeso.Text = prod.Peso.ToString("#0.00###");

            decimal comprimento = 18;
            decimal diametro = 5;
            decimal altura = 2;
            decimal largura = 11;
            int formato = 1;
            string maoPropria = "N";
            int valordeclarado = 0;
            string avisoRecebimento = "N";

            string cepDestino = "25645211";
            string cepOrigem = "36770000";
            string tipoServico = "41106";
            string cdEmpresa = string.Empty;
            string dsSenha = string.Empty;
            string retorno = "xml";

            var calculoCorreio = new CalculoCorreio.CalcPrecoPrazoWSSoapClient();
            var resultado = calculoCorreio.CalcPrecoPrazo(cdEmpresa, dsSenha, tipoServico, cepOrigem, cepDestino, prod.Peso.ToString(),
                                          formato, comprimento, altura, largura, diametro, maoPropria, valordeclarado,
                                          avisoRecebimento);

            lPeso.Text = resultado.Servicos[0].Valor;
            
            #region subCategorias

            if (prod.IdSubCategoria>0)
            {
                hlProdCategoria.Visible = true;
                hlProdCategoria.NavigateUrl = string.Format("ListaProdutos.aspx?IdCategoria={0}&IdSubCategoria={1}", prod.IdCategoria, prod.IdSubCategoria);
            }

            #endregion

        }

        #endregion


        #endregion

        #region Eventos

        #region Page_Load

        protected void Page_Load(object sender, EventArgs e)
        {
            Master.ExibirMensagem(Shop.TipoMensagem.Success, string.Empty);
            if (!IsPostBack)
            {
                if (!string.IsNullOrWhiteSpace(Request.QueryString["IdProduto"]) &&
                    BaseCompareValidator.CanConvert(Request.QueryString["IdProduto"], ValidationDataType.Integer))
                    IdProduto = Convert.ToInt32(Request.QueryString["IdProduto"]);
                else
                    throw new NullReferenceException("Produto não fornecido na visualização.");

                CarregarProduto();
            }
        }

        #endregion
        
        #endregion

        #region ibComprar_Click

        protected void ibComprar_Click(object sender, ImageClickEventArgs e)
        {
            AddChart(IdProduto);
        }

        #endregion

        #region bEnviar_Click

        protected void bEnviar_Click(object sender, EventArgs e)
        {
            IList<string> mensagens = new List<string>();

            #region Validacoes

            tbNome.CssClass = "form-txt";
            tbEmail.CssClass = "form-txt";
            ddlTipo.CssClass = string.Empty;
            tbTelefone.CssClass = "form-txt";
            tbMensagem.CssClass = "form-txt";

            
            if (string.IsNullOrWhiteSpace(tbNome.Text))
            {
                mensagens.Add("Nome é obrigatório.");
                tbNome.CssClass = "form-txt error";
            }
            if (string.IsNullOrWhiteSpace(tbEmail.Text))
            {
                mensagens.Add("Email é Obrigatório.");
                tbEmail.CssClass = "form-txt error";
            }
            else
            {
                string email = @"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$";
                Match match = Regex.Match(tbEmail.Text, email);
                if (!match.Success)
                {
                    mensagens.Add("Email inválido.");
                    tbEmail.CssClass = "form-txt error";
                }
            }

            if (ddlTipo.SelectedValue.Equals("0"))
            {
                mensagens.Add("Tipo de mensagem é obrigatório.");
                ddlTipo.CssClass = "error";
            }

            if (string.IsNullOrWhiteSpace(tbMensagem.Text))
            {
                mensagens.Add("Mensagem é obrigatória.");
                tbMensagem.CssClass = "form-txt error";
            }
            else
            {
                if (tbMensagem.Text.Length>500)
                {
                    mensagens.Add("A mensagem contém mais do que 500 caracteres.");
                    tbMensagem.CssClass = "form-txt error";
                }
            }

            if (mensagens.Count > 0)
            {
                Master.ExibirMensagem(Shop.TipoMensagem.Error, mensagens);
                return;
            }

            #endregion

            Produto prod = NServico.Db.Produtos.FirstOrDefault(p => p.IdProduto.Equals(IdProduto));

            string destinatarioEmail = ConfigurationManager.AppSettings["RemetenteEmail"]; //O e-mail do remetente
            string passwordEmail = ConfigurationManager.AppSettings["PasswordEmail"];

            string mensagem = @"
            Email de Contato do produto: {0} <br />
            Enviado por: 
            <ul>
            <li>Nome: {1} </li>
            <li>Email: {2}</li>
            <li>Tel: {3}</li> 
            </ul>
            <br />
            Data: {4} <br />
            Tipo: {5} <br />
            Mensagem: <br /> {6}                        
            ";

            string[] parametros = {
                                      prod.IdProduto + " - " + prod.Nome,
                                      tbNome.Text,
                                      tbEmail.Text,
                                      tbTelefone.Text,
                                      DateTime.Now.ToShortDateString(),
                                      ddlTipo.SelectedValue,
                                      tbMensagem.Text
                                  };

            mensagem = string.Format(mensagem, parametros);

            MailMessage mail = new MailMessage
                                   {
                                       From = new MailAddress(tbEmail.Text, "ShoP CarT", Encoding.UTF8),
                                       Subject = string.Format("Contato do Produto {0}", prod.IdProduto + "-"+ prod.Nome),
                                       SubjectEncoding = Encoding.UTF8,
                                       Body = mensagem,
                                       BodyEncoding = Encoding.UTF8,
                                       IsBodyHtml = true,
                                       Priority = MailPriority.Normal
                                   };
            mail.To.Add(destinatarioEmail);

            #region Configuracao

            SmtpClient client = new SmtpClient
                                    {
                                        Credentials = new NetworkCredential(destinatarioEmail, passwordEmail),
                                        Port = 587,
                                        Host = "smtp.gmail.com",
                                        EnableSsl = true
                                    };  //Adicionando as credenciais do seu e-mail e senha:

            #endregion

            try
            {
                client.Send(mail);
                Master.ExibirMensagem(Shop.TipoMensagem.Success, "Envio do E-mail com sucesso");
            }

            catch (Exception ex)
            {
                Master.ExibirMensagem(Shop.TipoMensagem.Error, "Ocorreu um erro ao enviar:" + ex.Message);
            }

            ddlTipo.SelectedIndex = -1;
            tbMensagem.Text = string.Empty;
        }

        #endregion

        #region AddChartClick

        protected void AddChartClick(object sender, EventArgs e)
        {
            AddChart(IdProduto);
        }

        #endregion

    }
}